package com.tang.juc.VolatileTest;

/**
 * @author tlm
 * @version 1.0
 * @date 2020/4/17 10:40
 * 指令重排案列（volatile禁止指令重排）
 */
public class VolatileDemo4 {
    int a = 0;
    boolean flag = false;

    public void method01() {
        a = 1;             //语句1
        flag = true;      //语句2
    }
    /*
        多线程环境中线程交替执行，由于编译器优化重排的存在
        两个线程中使用的变量能否保持一致性是无法确定的，结
        果无法预测。上述语句1和语句2 ，由于不存在数据依赖，编
        译器可能打乱其执行顺序，比如先执行语句2，再执行语句1
        ，这就有可能导致method02()在执行的时候出现a还没被赋
        值为1，就直接执行，最终计算出a=5的错误情况
     */
    public void method02() {
        if (flag) {
            a = a + 5;
            System.out.println("a的值为：" + a);
        }
    }
}
